package com.xingkeduo.tool;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @Desc 根据经纬度坐标计算两点的距离算法<br>
 * @Author pantong <br>
 * @Data 2019/4/30 18:38
 */
public class LocationUtils {

	private static double EARTH_RADIUS = 6378.137;
	
	private static double rad(double d)
	{
	   return d * Math.PI / 180.0;
	}
	
	
	/**
	 * 返回米
	 */
	public static BigDecimal getDistanceToM(double lat1, double lng1, double lat2, double lng2)
	{
	    double radLat1 = rad(lat1);
	    double radLat2 = rad(lat2);
	    double a = radLat1 - radLat2;
	    double b = rad(lng1) - rad(lng2);
	    double s = 2 * Math.asin(
	    		Math.sqrt(
	    				Math.pow(Math.sin(a/2),2) + 
	    Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)
	    )
	    		);
	    s = s * EARTH_RADIUS;
	    //s = Math.round(s * 10000) / 10000;
	    System.out.println(s);
	    return  BigDecimal.valueOf(s).multiply(BigDecimal.valueOf(1000L)).setScale(0, RoundingMode.DOWN);
	}
	
	/**
	 * 返回结果保留一位小数
	 */
	public static BigDecimal getDistance(double lat1, double lng1, double lat2, double lng2)
	{
	    double radLat1 = rad(lat1);
	    double radLat2 = rad(lat2);
	    double a = radLat1 - radLat2;
	    double b = rad(lng1) - rad(lng2);
	    double s = 2 * Math.asin(
	    		Math.sqrt(
	    				Math.pow(Math.sin(a/2),2) + 
	    Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)
	    )
	    		);
	    s = s * EARTH_RADIUS;
	    //s = Math.round(s * 10000) / 10000;
	    System.out.println(s);
	    return  BigDecimal.valueOf(s).setScale(1, RoundingMode.DOWN);
	}
	
	
	public static BigDecimal formartDistanceFromToKm(Double distance) {
		if(distance!=null) {
			return BigDecimal.valueOf(distance).divide(BigDecimal.valueOf(1000l), 1, RoundingMode.DOWN);
		}
		return null;
	}
	
	public static void main(String ags[]) {
		System.out.println(getDistance(39.9219,116.44355,39.90561,116.45833));
		System.out.println(getDistanceToM(39.9219,116.44355,39.90561,116.45833));
		//System.out.println(getDistance(37.46806,121.3522,37.46816,121.3495));
	}
	
}
